<?php if(!defined('CALL')) exit('No direct script access allowed');

include_once('ctrl/page.class.php');
include_once('lib/utils.class.php');
include_once('lib/mailer.class.php');
include_once('view/v_usercard.class.php');
include_once('view/v_menus.class.php');
include_once('view/v_signup.class.php');
include_once('models/m_candidat.class.php');

class PageSignup extends Page
{
	private $smtp_url = null;
	
	public function __construct($smpt_url)
	{
		parent::__construct(null, null);
		$this->page_name = "signup";
		$this->smtp_url = $smpt_url;
	}
	
	protected function gen_main()
	{
		$candidat = new mCandidat();
		$v = new vSignup();
		
		// заход на страницу регистрации без уникальной ссылки
		$hash = Utils::get_param('hash', null);
		if(is_null($hash))
		{
			// сюда идет переход после того, как:
			// 1. обработана форма before
			// 2. отправлено письмо с уникальной формой
			// переход нужен для очистки POST

			// определить, что был редирект можно через переменную сессии "stage"
			// это работает только для формы "before"
			if(isset($_SESSION['stage']))
			{
				$stage = $_SESSION['stage'];
				unset($_SESSION['stage']);
				
				// если обрабатываем редирект с отправки тестового письма
				// то просто сообщаем об этом
				if($stage == 'before')
				{
					return $v->build_info(
						'Регистрация',
						'На указанный Вами адрес выслано письмо для завершения регистрации.'
						);
				}
			}
			// это не редирект
			else
			{
				// на каком шаего регистрация? before или after эл.письма
				$stage = Utils::post_param('stage', null);
				
				Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, "stage: ".$stage);
				// нет его - показываем форму "before"
				if(is_null($stage))
				{
					return $v->build_before();
				}
				
				// обрабатываем данные присланные формой "before"
				elseif($stage == 'before')
				{
					$email = Utils::post_param('email', null);
					$password = Utils::post_param('password', null);
					// проверка формата email
					if(filter_var($email, FILTER_VALIDATE_EMAIL))
					{
						// проверка длины пароля
						if(strlen($password) > 0)
						{
							// если нет зарегистрированного пользователя с таким email
							if(mUser::get_id($email, 0) == 0)
							{
								
								// пытаемся записать кандидата в БД
								if($candidat->insert($email, $password))
								{
									// отправляем ему письмо с уникальной ссылкой
									$this->send_id($candidat);
									
									// РЕДИРЕКТ! на себя для очистки POST
									// чтобы понять, что это редирект из формы "before"
									$_SESSION['stage'] = 'before';
									header("location: ".ROOT_URL."/signup/");
								}
							}
								
							return $v->build_error('Упс!', 'Почтовый адрес <b>'.$email.'</b> уже занят.');
						}
						else
						{
							// пароль не соответсвует требованиям
							return $v->build_error('Будьте внимательны', 'Пароль не может быть пустым!');
						}
					}
					else
					{
						// email введен неправильно
						return $v->build_error('Ошибка', 'Неверный формат адреса электропочты: '.$email);
					}
				}
				
				// обработка данных из формы "after"
				elseif($stage == 'after')
				{
					// проверка присланных данных и если все нормально,
					// то создаем в БД учетную запись
					
					$email = Utils::post_param('email', null);
					$candidat->load($email);
					
					$username = Utils::post_param('username', null);
					$born = Utils::post_param('born', null);
					$male = Utils::post_param('male', 'Y');
					$city_id = Utils::post_param('city_id', 0);
					$note = Utils::post_param('note', null);
					
					
					$user = new mUser();
					try
					{
						$user->register($username, $email, $this->props['password'], $born, $male, $city_id, $note);
						if($user->id) $candidat->delete();
					}
					catch(Exception $e)
					{
						$msg = 'Пользователь уже зарегистрирован ранее.';
						return $v->build_error('Ошибка', $msg);
					}
					
					// переход на корневую страницу (планы)
					header('location: '.ROOT_URL);
					// и сообщаем об этом "ОК"
					// return $v->build_info('Регистрация', 'Регистрация успешно завершена. <a href="'.ROOT_URL.'">Вперед!</a>');
					
					// если есть ошибки, то сообщаем о них
				}
				// непонятно что это, на всякий случай отправляем на первую форму
				else
				{
					return $v->build_before();
				}
			}
		}
		// заход с уникальной ссылкой из письма - показ формы "after"
		else
		{
			$email = Utils::get_param('email', null);
			$candidat->load($email);

			Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, "hash: ".$hash);
			// свойства для пользователя с таким email загружены нормально
			// т.е. такой п/я существует
			if(!is_null($candidat->props))
			{
				// у пользователя сопадают хэш в БД и хэш в URL
				if($candidat->props['hash'] == $hash)
				{
					$candidat->check();
					$user = new mUser();
					$user->login($candidat->props['mail'], $candidat->props['password']);
					return $v->build_after($email);
				}
			}
				
			// в противном случае - ошибка
			$msg =
				'Ваш адрес электронной почты подтвердить не удалось.<br/>'.
				'Попробуйте <a href="'.ROOT_URL.'/signup/">еще раз</a>';
			return $v->build_error('Ошибка', $msg);
		}
	}

	protected function gen_side()
	{
		$html = '';
		
		// $menus = new vMenus();
		// $html .= $menus->gen_search_form();
		
		// $card = new vUsercard();
		// $html .= $card->generate($this->actor, $this->actor, FALSE);
		return $html;
	}

	protected function add_css()
	{
		return "";
	}

	protected function add_css_files()
	{
		return "";
	}

	protected function add_js()
	{
		return "";
	}

	protected function add_js_files()
	{
		return "";
	}
	
	private function send_id($candidat)
	{
		if(is_null($candidat->props)) return FALSE;
		
		$v = new vSignup();
		$url = ROOT_URL."/signup/".$candidat->props['mail']."/".$candidat->props['hash']."/";
		$msg = $v->build_mail_message($url);
		$subj = 'КогдаКак: Проверка адреса';
		
		Mailer::send(array($candidat->props['mail']), $subj, $msg);
	}
}
